/**
 * 项目DTO
 * 用于跨项目数据传输的项目信息对象
 */
const BaseDTO = require('../../../comm/model/dto/base_dto');
const AppUtil = require('../../../../framework/core/app_util');

class ProjectDTO {
  /**
   * 将完整项目模型转换为对外DTO
   * @param {Object} projectModel 项目模型
   * @returns {Object} 项目DTO
   */
  static toDTO(projectModel) {
    if (!projectModel) return null;
    
    // 定义映射关系
    const mapping = {
      id: '_id',
      model: 'model',
      customerName: 'customerName',
      projectType: 'projectType',
      startDate: 'startDate',
      deadline: 'deadline',
      status: 'level1',
      statusText: (model) => model.statusDesc || '',
      priority: 'priority',
      manager: 'projectLead',
      managerId: 'projectLeadId',
      progress: (model) => Math.floor((model.completedTasks || 0) / (model.totalTasks || 1) * 100),
      lastUpdateTime: 'updateTime'
    };
    
    // 使用基类转换
    const dto = BaseDTO.fromModel(projectModel, mapping);
    
    // 数据处理和脱敏
    if (dto.manager && typeof dto.manager === 'object') {
      dto.managerName = dto.manager.name;
      dto.managerAvatar = dto.manager.avatar;
      delete dto.manager; // 移除原始对象
    }
    
    // 敏感字段处理
    if (projectModel.internalNotes) {
      dto.hasNotes = true;
    }
    
    return dto;
  }
  
  /**
   * 将项目列表转换为DTO列表
   * @param {Array} projectList 项目列表
   * @returns {Array} DTO列表
   */
  static toDTOList(projectList) {
    return BaseDTO.fromModelList(projectList, {
      id: '_id',
      model: 'model',
      customerName: 'customerName', 
      projectType: 'projectType',
      deadline: 'deadline',
      status: 'level1',
      priority: 'priority',
      progress: (model) => Math.floor((model.completedTasks || 0) / (model.totalTasks || 1) * 100),
      managerName: 'projectLead',
      managerId: 'projectLeadId'
    });
  }
  
  /**
   * 将简略DTO转回项目模型（用于创建和更新）
   * @param {Object} dto 项目DTO
   * @returns {Object} 项目模型
   */
  static fromDTO(dto) {
    if (!dto) return null;
    
    // 反向映射
    const mapping = {
      id: '_id',
      model: 'model',
      customerName: 'customerName',
      projectType: 'projectType',
      startDate: 'startDate',
      deadline: 'deadline',
      priority: 'priority',
      // 不允许通过DTO直接修改状态，状态变更需通过流程控制
    };
    
    // 转换回模型对象
    const model = BaseDTO.toModel(dto, mapping);
    
    // 添加系统字段
    model.updateTime = AppUtil.time();
    
    return model;
  }
}

module.exports = ProjectDTO; 